import axios from 'axios'
import store from '@/store/index.js'
import { Message } from 'element-ui'
import { setToken, getToken, removeToken } from '@/utils/auth'
import { transform } from '@/utils/transformRequest'
const service = axios.create({
    baseURL: location.host.split(':')[0] == 'localhost' ? 'https://dev.hahaipi.com/smsi/index.php' : `https://${location.host}/smsi/index.php`, // api的base_url
    // baseURL: location.host.split(':')[0] == 'localhost' ? 'http://100.100.100.61/index.php' : `https://${location.host}/smsi/index.php`, // api的base_url
    timeout: 120000, // 请求超时时间
    transformRequest: [transform()]
})
let pending = []; //声明一个数组用于存储每个ajax请求的取消函数和ajax标识
let cancelToken = axios.CancelToken;
let canRequest=1;
let isIdentical=1; //用户登录状态是否改变
let removePending = (config) => {
    let time=(new Date()).getTime();
    for (let p in pending) {
        if (pending[p].u === config.url + '&' + config.method + JSON.stringify(config.data)) { //当当前请求在数组中存在时执行函数体
            if(time-pending[p].t<300){ //当两次相同的请求时间小于1000ms时，取消本次请求
                canRequest=0;
            }else{
                //pending[p].f(); //执行取消操作
                pending.splice(p, 1); //把这条记录从数组中移除
                canRequest=1;
            }
            return;
        }else{
            canRequest=1
        }
    }
}
// request拦截器
service.interceptors.request.use(config => {
    if (getToken()) {
        config.headers['didixueshengka'] = getToken() // 让每个请求携带自定义token 请根据实际情况自行修改
    }
    // 判断用户登录状态是否改变
    if(store.getters.oldUid&&store.getters.oldUid!=JSON.parse(localStorage.getItem("USER_INFO")).id){
        isIdentical=0;
    }
    // 所有请求默认带上平台id
    if(localStorage.getItem('platId')){
        config.headers['platid'] = localStorage.getItem('platId');
    }
    // 所有请求默认带上机构id，机构id根据平台不同定义会不一样，比如运管系统平台下的机构表示母品牌
    if(localStorage.getItem('orgId')){
        config.headers['orgid'] = localStorage.getItem('orgId');
    }
    removePending(config); //在一个ajax发送前执行一下取消操作
    //console.log(pending)
    config.cancelToken = new cancelToken((c) => {
        // 这里的ajax标识我是用请求地址&请求方式拼接的字符串，当然你可以选择其他的一些方式
        if(isIdentical==0){ //取消请求操作
            console.log("登录状态已变更，请刷新浏览器！")
            Message({ message: "登录状态已变更，请刷新浏览器！", type: 'error', duration: 5000 })
            c();
            return;
        }
        if(canRequest==0){ //取消请求操作
            console.log("重复请求")
            c();
            return;
        }
        pending.push({ u: config.url + '&' + config.method + JSON.stringify(config.data), f: c, t:(new Date()).getTime() });
    });

    return config
}, error => {
    // Do something with request error
    console.log(error) // for debug
    Promise.reject(error)
})

// respone拦截器
service.interceptors.response.use(response => {
        /**
         * code为非20000是抛错 可结合自己业务进行修改
         */
        if(getToken()){
            setToken(getToken())
        }
        //每次请求刷新cookie时间
        const res = response.data
        if (res.code && res.code != 1) {
            Message({ message: res.message?res.message:res.msg, type: 'error', duration: 5000 })
            if (res.code == -886) {
                removeToken()
            }
            return Promise.reject(response.data)
        } else {
            return response.data
        }
    },
    error => {
        console.log('err' + error) // for debug
        // let msg = error == 'Cancel' ? 'pending中...请勿重复点击哦' : error.message && error.message.includes('timeout') ? '请求超时，请稍后再试哦' : error.message;
        if (error != 'Cancel') {
            Message({
                message: error.message && error.message.includes('timeout') ? '请求超时，请稍后再试哦' : error.message,
                type: 'error',
                duration: 5000
            })
            return Promise.reject(error)
        }else{
            return Promise.reject('重复点击请求关闭',error)
        }
    }
)

export default service
